package com.yjy;

import org.junit.Test;

import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * 测试Java8新特性：函数式接口
 * 详情：https://www.runoob.com/java/java8-functional-interfaces.html
 * 函数式接口包括Consumer接口、Function接口、Supplier接口、Predicate接口
 * 使用：公共部分统一在某方法里，不同部分通过传入Consumer、Function等进行消化
 */
public class FunctionalInterfaceTest {

    // 测试：Consumer<T> 代表了接受一个输入参数并且无返回的操作
    // 模拟场景：不同支付渠道的回调通知更新订单状态，由于数据库更新订单的步骤都是相同的，不同的是不同支付渠道的字段set到订单的内容（在Consumer进行）
    @Test
    public void test_consumer() {
        // 支付宝的回调通知，order字段赋值
        Consumer<String> alipayConsumer = order -> System.out.println("alipay支付渠道" + order);
        updateState(alipayConsumer);

        // 微信的回调通知，order字段赋值
        Consumer<String> wechatConsumer = order -> System.out.println("wechat支付渠道" + order);
        updateState(wechatConsumer);
    }

    private void updateState(Consumer<String> orderConsumer) {
        String orderObj = "模拟order对象，传入进行更新订单表order、orderDtl状态";
        orderConsumer.accept(orderObj);
    }

    // 测试：Function<T,R> 接受一个输入参数，返回一个结果
    @Test
    public void test_function() {
        Function<Integer, String> numFunction = i -> "编号" + i;
        System.out.println(numFunction.apply(2));
        System.out.println(numFunction.apply(4));
    }

    // 测试：BiConsumer<T,U> 代表了一个接受两个输入参数的操作，并且不返回任何结果
    @Test
    public void test_BiConsumer() {
        BiConsumer<Integer, Integer> addFunction = (a, b) -> System.out.println("执行计算：" + String.format("%d + %d = %d", a, b, a + b));
        addFunction.accept(1, 2);
        addFunction.accept(3, 5);
    }

    // 测试：BiFunction<T,U,R> 代表了一个接受两个输入参数的方法，并且返回一个结果
    @Test
    public void test_BiFunction() {
        BiFunction<Integer, Integer, String> addFunction = (a, b) -> String.format("%d + %d = %d", a, b, a + b);
        System.out.println(addFunction.apply(1, 2));
        System.out.println(addFunction.apply(3, 5));
    }

}
